import {
  createStore,
  applyMiddleware,
  Store,
  AnyAction,
  Dispatch,
} from 'redux';
import reducers, { CombinedState } from './reducers';
import logger from 'redux-logger';
import thunk, { ThunkDispatch } from 'redux-thunk';
import promise from 'redux-promise';
import { routerMiddleware } from 'connected-react-router';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import history from './history';

const persistConfig = {
  key: 'root',
  storage,
  whitelist: ['cart'],
};
const persistedReducer = persistReducer(persistConfig, reducers);
let store: Store<CombinedState, AnyAction> = createStore<
  CombinedState,
  AnyAction,
  {},
  {}
>(
  persistedReducer,
  applyMiddleware(thunk, routerMiddleware(history), promise, logger)
);
let persistor = persistStore(store);
export type StoreGetState = () => CombinedState;
export type StoreDispatch = Dispatch &
  ThunkDispatch<CombinedState, any, AnyAction>;
export { store, persistor };
export default store;
